package collection_test.queue.blcok_queue;

import java.util.concurrent.SynchronousQueue;

/**
 * SynchronousQueue 队列容量为0， 用于两个线程直接交换数据
 */
public class SynchronousQueueTest {
    public static void main(String[] args) throws InterruptedException {
        SynchronousQueue synchronousQueue = new SynchronousQueue();
        new Thread(() -> {
            try {
                Thread.sleep(2000);
                synchronousQueue.put("456"); //阻塞住，等待消费者消费
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }).start();

        new Thread(() -> {
            try {
                Thread.sleep(5000);
                System.out.println(synchronousQueue.take());
                System.out.println(synchronousQueue.take());
                System.out.println(synchronousQueue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }).start();

//        synchronousQueue 内部是有一个stack维护队列， 因此如果多个线程都去put，take时释放线程阻塞的顺序是后入先出的
        //这里让主线程先阻塞，然后另外一个put的线程再阻塞，释放阻塞的时候发现 后面的线程先解开的阻塞
        synchronousQueue.put("123"); //阻塞住，等待消费者消费

        //不能进行add的操作，因为队列容量为0，只能用于直接交换
        System.out.println(synchronousQueue.size());

        while (true) ;

    }

}
